package tum0r.webengine.defaults.command

import tum0r.webengine.annotations.Command
import tum0r.webengine.config.ApplicationConfig
import tum0r.webengine.config.BaseConfig
import tum0r.webengine.enums.EConfigType
import tum0r.webengine.extension.*
import tum0r.webengine.models.core.StaticResource
import java.io.File

/**
 * 说明: 服务器配置命令
 *
 * 创建者: tum0r
 *
 * 时间: 2021/8/23 20:36
 */
@Command
class ApplicationCommand {
    /**
     * 添加被禁止访问的IP地址
     *
     * @param[IP] IP地址字符串
     */
    fun addBanIP(IP: String) {
        if (!IP.check("被禁止访问的IP地址")) return
        ApplicationConfig.BAN_IP.add(IP)
        "被禁止访问的IP地址添加成功".infoLog()
    }

    /**
     * 删除被禁止访问的IP地址
     *
     * @param[IP] IP地址字符串
     */
    fun removeBanIP(IP: String) {
        if (!IP.check("被禁止访问的IP地址")) return
        if (!ApplicationConfig.BAN_IP.contains(IP)) {
            "没有找到此被禁止访问的IP地址".errorLog()
            return
        }
        ApplicationConfig.BAN_IP.remove(IP)
        "被禁止访问的IP地址删除成功".infoLog()
    }

    /**
     * 清除被禁止访问的IP地址列表
     */
    fun clearBanIP() {
        ApplicationConfig.BAN_IP.clear()
        "清除被禁止访问的IP地址成功".infoLog()
    }

    /**
     * 导出被禁止访问的IP地址到文件
     *
     * @param[path] 导出文件地址
     */
    fun exportBanIP(path: String) {
        val file = File(path)
        file.createParentDir()
        val result = StringBuilder()
        for (IP in ApplicationConfig.BAN_IP) result.appendLine(IP)
        file.writeText(result.toString())
        "导出被禁止访问的IP地址到文件成功".infoLog()
    }

    /**
     * 设置服务器名，默认为工作目录的名称
     *
     * @param[serverName] 服务器名
     */
    fun setServerName(serverName: String) {
        if (!serverName.check("服务器名")) return
        ApplicationConfig.SERVER_NAME = serverName
        "服务器名设置为[$serverName]".infoLog()
    }

    /**
     * 设置服务器端口，默认为48264
     *
     * @param[port] 服务器端口号，应在[1024,65535)之间，且不能被占用
     */
    fun setServerPort(port: Int) {
        if (port !in 1024 until 65535) {
            "服务器端口号应在[1024, 65535)之间，且不能被占用".errorLog()
            return
        }
        ApplicationConfig.SERVER_PORT = port
        "服务器端口号设置为[$port]".infoLog()
    }

    /**
     * 设置上传文件保存路径
     *
     * @param[path] 路径
     */
    fun setUploadsDir(path: String) {
        if (!path.check("上传文件保存路径")) return
        ApplicationConfig.UPLOADS_DIR = File(path)
        ApplicationConfig.UPLOADS_DIR.createDir()
        "上传文件保存路径设置为[${ApplicationConfig.UPLOADS_DIR.absolutePath}]".infoLog()
    }

    /**
     * 添加静态资源文件夹
     *
     * @param[dirPath] 静态资源文件夹路径
     * @param[mapping] 静态资源文件夹映射
     * @param[indexPath] 静态资源文件首页文件路径
     */
    fun addStaticResource(dirPath: String, mapping: String, indexPath: String) {
        if (!dirPath.check("静态资源文件夹路径")) return
        if (!mapping.check("静态资源文件夹映射")) return
        if (!dirPath.check("静态资源文件首页文件路径")) return
        val dir = File(dirPath)
        val indexFile = File(indexPath)
        if (!indexFile.absolutePath.startsWith(dir.absolutePath)) {
            "静态资源首页必须在静态资源文件内".errorLog()
            return
        }
        val target = StaticResource(dir, mapping, indexFile)
        ApplicationConfig.STATIC_RESOURCES.add(target)
        "添加静态资源文件夹[${dir.absolutePath}]，映射为[$mapping]，首页文件为[${indexFile.absolutePath}]".infoLog()
    }

    /**
     * 关闭服务器
     */
    fun exit() = BaseConfig.setState(EConfigType.SERVER_IS_OPEN, flag = false, quiet = true)

    /**
     * 关闭服务器
     */
    fun quit() = exit()

    /**
     * 关闭服务器
     */
    fun close() = exit()
}